//数据监听的父类 提供通用的监听方法等
function DataManager() {
	//监听器
	this.sys_listeners = [];
	//携带的数据
	this.data = {};

	//这个表中标记哪些数据是需要存储在本地存储的
	this.saveToStorageMap = {}
}



//添加监听器
DataManager.prototype.addListener = function(lthis, dataname, callback) { // lthis 调用者 dataname 就是字段 callback
	//把这个监听器 添加到监听器队列
	let listener = {
		name: dataname, //这个页面监听什么字段
		fun: callback, //回调函数
		lthis: lthis //页面对象
	}
	this.sys_listeners.push(listener)
	//看看现在有没有数据
	let data = this.data[dataname];
	//如果有 直接回调一次
	if (data != null) {
		callback.apply(lthis, [data]);
	}
	
	//
	if (!lthis._SYS_REMOVE_TAG) {
		lthis._SYS_REMOVE_TAG = true;
		if(lthis.$once)
		{
			lthis.$once('hook:beforeDestroy',()=>{
				this.removeMyListener(lthis);
				console.log("removelistener")
			})
		}
	}
	return listener;
}


//删除监听器
DataManager.prototype.removeListener = function(listener) {
	var sys_listeners = this.sys_listeners;
	for (var index in sys_listeners) {
		if (sys_listeners[index] == listener) {
			sys_listeners.splice(index, 1);
			break;
		}
	}
}

//删除某个对象的所有监听器
DataManager.prototype.removeMyListener = function(lthis) {
	var sys_listeners = this.sys_listeners;
	for (var index = sys_listeners.length; --index >= 0;) {
		if (sys_listeners[index].lthis == lthis) {
			sys_listeners.splice(index, 1);
		}
	}
}

//notify 通知某个名字的监听器 数据发生了改变
DataManager.prototype.Notify = function(tag, data) {
	var sys_listeners = this.sys_listeners;
	for (var index = sys_listeners.length; --index>=0;) {
		try{
			if (sys_listeners[index].name == tag) {
				sys_listeners[index].fun.apply(sys_listeners[index].lthis, [data]);
			}
		}catch(e)
		{
			console.log(e)
		}
	}
}

//设置某个数据
DataManager.prototype.setData = function(key, data) {
	//对应的字段赋值
	this.data[key] = data
	if (this.saveToStorageMap[key]) {
		let itemvalue = data;
		switch (this.saveToStorageMap[key]) {
			case Object:
				itemvalue = JSON.stringify(data)
				break;
			default:
				break;
		}
		localStorage.setItem(key, itemvalue)
	}
	this.Notify(key, data)
}

//获取某个数据
DataManager.prototype.getData = function(key) {
	return this.data[key]
}

//从localStorage中加载数据
DataManager.prototype.load = function() {
	for (let key in this.saveToStorageMap) {
		let itemvalue = localStorage.getItem(key);
		if (itemvalue == null || itemvalue == '') {
			continue;
		}
		switch (this.saveToStorageMap[key]) {
			case Object:
				itemvalue = JSON.parse(itemvalue);
				break;
			default:
				break;
		}
		this.data[key] = itemvalue;
	}
}



export default DataManager
